home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 May / PCpro_2006_05.ISO / files / mobile / fma-2.0-stable-setup.exe / {app} / source / uScriptEditor.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-05-20  |  8.3 KB  |  286 lines

  1. unit uScriptEditor;
  2.  
  3. {
  4. *******************************************************************************
  5. * Descriptions: Script Editor
  6. * $Source: /cvsroot/fma/fma/uScriptEditor.pas,v $
  7. * $Locker:  $
  8. *
  9. * Todo:
  10. *
  11. * Change Log:
  12. * $Log: uScriptEditor.pas,v $
  13. * Revision 1.1  2004/05/20 06:38:25  z_stoichev
  14. * Initial checkin.
  15. *
  16. *
  17. *******************************************************************************
  18. }
  19.  
  20. interface
  21.  
  22. uses 
  23.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  24.   ExtCtrls, StdCtrls, ComCtrls, Menus, SynEditHighlighter,
  25.   SynEdit, SynMemo, Buttons, SynHighlighterVBScript, aw_SCtrl;
  26.  
  27. type
  28.   TfrmEditor = class(TFrame)
  29.     DetailsPanel: TPanel;
  30.     Script: TSynMemo;
  31.     MessagesPanel: TPanel;
  32.     MessagesSplitter1: TSplitter;
  33.     Panel1: TPanel;
  34.     SpeedButton1: TSpeedButton;
  35.     MessagesMemo1: TMemo;
  36.     PrecompileTimer1: TTimer;
  37.     SynVBScriptSyn1: TSynVBScriptSyn;
  38.     ScriptControl: TawScriptControl;
  39.     PopupMenu1: TPopupMenu;
  40.     Undo1: TMenuItem;
  41.     N1: TMenuItem;
  42.     Cut1: TMenuItem;
  43.     Copy1: TMenuItem;
  44.     Paste1: TMenuItem;
  45.     Delete1: TMenuItem;
  46.     N2: TMenuItem;
  47.     SelectAll1: TMenuItem;
  48.     N3: TMenuItem;
  49.     SaveChanges1: TMenuItem;
  50.     N4: TMenuItem;
  51.     FindNextError1: TMenuItem;
  52.     ReplaceDialog1: TReplaceDialog;
  53.     N5: TMenuItem;
  54.     Find1: TMenuItem;
  55.     FindNext1: TMenuItem;
  56.     Replace1: TMenuItem;
  57.     OpenDialog1: TOpenDialog;
  58.     LoadFromFile1: TMenuItem;
  59.     procedure ScriptStatusChange(Sender: TObject;
  60.       Changes: TSynStatusChanges);
  61.     procedure SpeedButton1Click(Sender: TObject);
  62.     procedure MessagesSplitter1Moved(Sender: TObject);
  63.     procedure MessagesMemo1Change(Sender: TObject);
  64.     procedure PrecompileTimer1Timer(Sender: TObject);
  65.     procedure ScriptChange(Sender: TObject);
  66.     procedure ScriptReplaceText(Sender: TObject; const ASearch,
  67.       AReplace: String; Line, Column: Integer;
  68.       var Action: TSynReplaceAction);
  69.     procedure ScriptControlError(Sender: TObject; Error: TawScriptError);
  70.     procedure SaveChanges1Click(Sender: TObject);
  71.     procedure PopupMenu1Popup(Sender: TObject);
  72.     procedure FindNextError1Click(Sender: TObject);
  73.     procedure ReplaceDialog1Find(Sender: TObject);
  74.     procedure Find1Click(Sender: TObject);
  75.     procedure FindNext1Click(Sender: TObject);
  76.     procedure Replace1Click(Sender: TObject);
  77.     procedure LoadFromFile1Click(Sender: TObject);
  78.   private
  79.     { Private declarations }
  80.     procedure DoShowCaretInfo;
  81.     function Get_MessagesVisible: boolean;
  82.     procedure Set_MessagesVisible(const Value: boolean);
  83.   public
  84.     { Public declarations }
  85.     procedure Initialize;
  86.     procedure FindReplace(Find,Replace: string; Backwards,WholeWord,ReplaceAll: boolean);
  87.     property MessagesVisible: boolean read Get_MessagesVisible write Set_MessagesVisible; 
  88.   end;
  89.  
  90. implementation
  91.  
  92. uses Unit1;
  93.  
  94. {$R *.dfm}
  95.  
  96. procedure TfrmEditor.DoShowCaretInfo;
  97. var
  98.   s: string;
  99. begin
  100.   if DetailsPanel.Visible then begin
  101.     s := Format(' %s: %.5d  %s: %.5d  %s: %.5d  %s: %.7d',
  102.       ['Row',Script.CaretY,'Col',Script.CaretX,'Lines',Script.Lines.Count,'Chars',Length(Script.Text)]);
  103.     if not Script.InsertMode then
  104.       s := s + '  Overwrite';
  105.     s := s + '  [' + Form1.ScriptFilename + ']';  
  106.     if Script.Modified then
  107.       s := s + '  *';
  108.     DetailsPanel.Caption := s;
  109.   end;
  110. end;
  111.  
  112. function TfrmEditor.Get_MessagesVisible: boolean;
  113. begin
  114.   Result := MessagesPanel.Visible;
  115. end;
  116.  
  117. procedure TfrmEditor.Initialize;
  118. begin
  119.   ScriptControl.Language := Form1.ScriptControl.Language;
  120.   Script.Modified := False;
  121.   Script.ReadOnly := Form1.ScriptFilename = '';
  122.   if Script.ReadOnly then
  123.     DetailsPanel.Caption := ' Please specify the script file to be used in Options.'
  124.   else
  125.     DoShowCaretInfo;
  126.   PrecompileTimer1.Enabled := True;
  127. end;
  128.  
  129. procedure TfrmEditor.ScriptStatusChange(Sender: TObject;
  130.   Changes: TSynStatusChanges);
  131. begin
  132.   if [scInsertMode, scModified, scCaretX, scCaretY] * Changes <> [] then
  133.     DoShowCaretInfo;
  134. end;
  135.  
  136. procedure TfrmEditor.Set_MessagesVisible(const Value: boolean);
  137. begin
  138.   MessagesPanel.Visible := Value;
  139.   MessagesSplitter1.Visible := Value;
  140.   if Value then
  141.     MessagesSplitter1.Top := MessagesPanel.Top-1
  142.   else
  143.     MessagesMemo1.Lines.Clear;
  144.   Update;
  145. end;
  146.  
  147. procedure TfrmEditor.SpeedButton1Click(Sender: TObject);
  148. begin
  149.   MessagesVisible := False;
  150. end;
  151.  
  152. procedure TfrmEditor.MessagesSplitter1Moved(Sender: TObject);
  153. begin
  154.   if MessagesPanel.Height < MessagesSplitter1.MinSize then
  155.     MessagesPanel.Height := MessagesSplitter1.MinSize;
  156. end;
  157.  
  158. procedure TfrmEditor.MessagesMemo1Change(Sender: TObject);
  159. begin
  160.   MessagesVisible := MessagesMemo1.Lines.Count <> 0;
  161. end;
  162.  
  163. procedure TfrmEditor.PrecompileTimer1Timer(Sender: TObject);
  164. begin
  165.   PrecompileTimer1.Enabled := False;
  166.   try
  167.     ScriptControl.Code.Assign(Script.Lines);
  168.     MessagesVisible := False;
  169.   except
  170.     // silent error here
  171.   end;
  172.   ScriptControl.Code.Clear;
  173. end;
  174.  
  175. procedure TfrmEditor.ScriptChange(Sender: TObject);
  176. begin
  177.   PrecompileTimer1.Enabled := False;
  178.   PrecompileTimer1.Enabled := True;
  179. end;
  180.  
  181. procedure TfrmEditor.FindReplace(Find, Replace: string; Backwards,
  182.   WholeWord, ReplaceAll: boolean);
  183. var
  184.   so: TSynSearchOptions;
  185.   sl: string;
  186. begin
  187.   sl := Script.SelText;
  188.   so := [];
  189.   if Backwards then so := so + [ssoBackwards];
  190.   if WholeWord then so := so + [ssoWholeWord];
  191.   if (sl <> '') and (AnsiCompareText(Script.SelText,Find) <> 0) then
  192.     so := so + [ssoSelectedOnly];
  193.   if AnsiCompareText(Find,Replace) <> 0 then so := so + [ssoReplace];
  194.   if ReplaceAll then so := so + [ssoReplaceAll];
  195.   if [ssoReplace,ssoReplaceAll] * so <> [] then so := so + [ssoPrompt];
  196.   Script.SearchReplace(Find,Replace,so);
  197. end;
  198.  
  199. procedure TfrmEditor.ScriptReplaceText(Sender: TObject; const ASearch,
  200.   AReplace: String; Line, Column: Integer; var Action: TSynReplaceAction);
  201. begin
  202.   MessageBeep(MB_ICONQUESTION);
  203.   case MessageDlg('Do you want to replace this text?',mtConfirmation,[mbYes,mbNo,mbCancel,mbAll],0) of
  204.     mrYes: Action := raReplace;
  205.     mrNo: Action := raSkip;
  206.     mrCancel: Action := raCancel;
  207.     mrAll: Action := raReplaceAll;
  208.   end;
  209. end;
  210.  
  211. procedure TfrmEditor.ScriptControlError(Sender: TObject;
  212.   Error: TawScriptError);
  213. begin
  214.   if not MessagesVisible then begin
  215.     Script.CaretX := Error.Column+1;
  216.     Script.CaretY := Error.Line;
  217.   end;
  218.   MessagesMemo1.Lines.Text := Format('Error at line %d, col %d:'#13#10'Reason: %s',
  219.     [Error.Line,Error.Column+1,Error.Description]);
  220. end;
  221.  
  222. procedure TfrmEditor.SaveChanges1Click(Sender: TObject);
  223. begin
  224.   Form1.ApplyEditorChanges;
  225.   DetailsPanel.Caption := Format(' %d bytes written',[Length(Script.Text)]);
  226. end;
  227.  
  228. procedure TfrmEditor.PopupMenu1Popup(Sender: TObject);
  229. begin
  230.   SaveChanges1.Enabled := Script.Modified;
  231. end;
  232.  
  233. procedure TfrmEditor.FindNextError1Click(Sender: TObject);
  234. begin
  235.   MessagesVisible := False;
  236.   PrecompileTimer1Timer(PrecompileTimer1);
  237. end;
  238.  
  239. procedure TfrmEditor.ReplaceDialog1Find(Sender: TObject);
  240. var
  241.   Replace: string;
  242. begin
  243.   if [frReplace,frReplaceAll] * ReplaceDialog1.Options <> [] then
  244.     Replace := ReplaceDialog1.ReplaceText
  245.   else
  246.     Replace := ReplaceDialog1.FindText;
  247.   FindReplace(ReplaceDialog1.FindText,Replace,
  248.     not (frDown in ReplaceDialog1.Options), frWholeWord in ReplaceDialog1.Options,
  249.     frReplaceAll in ReplaceDialog1.Options);
  250. end;
  251.  
  252. procedure TfrmEditor.Find1Click(Sender: TObject);
  253. begin
  254.   if Script.SelText <> '' then begin
  255.     ReplaceDialog1.FindText := Script.SelText;
  256.     ReplaceDialog1.ReplaceText := '';
  257.   end;
  258.   ReplaceDialog1.Execute;
  259. end;
  260.  
  261. procedure TfrmEditor.FindNext1Click(Sender: TObject);
  262. begin
  263.   FindReplace(ReplaceDialog1.FindText,ReplaceDialog1.FindText,
  264.     not (frDown in ReplaceDialog1.Options), frWholeWord in ReplaceDialog1.Options,
  265.     frReplaceAll in ReplaceDialog1.Options);
  266. end;
  267.  
  268. procedure TfrmEditor.Replace1Click(Sender: TObject);
  269. begin
  270.   if Script.SelText <> '' then begin
  271.     ReplaceDialog1.FindText := Script.SelText;
  272.     ReplaceDialog1.ReplaceText := Script.SelText;
  273.   end;
  274.   ReplaceDialog1.Execute;
  275. end;
  276.  
  277. procedure TfrmEditor.LoadFromFile1Click(Sender: TObject);
  278. begin
  279.   if OpenDialog1.Execute then begin
  280.     if Script.Modified then SaveChanges1.Click;
  281.     Script.Lines.LoadFromFile(OpenDialog1.FileName);
  282.   end;
  283. end;
  284.  
  285. end.
  286.